module sram8x8(RD,RSTN,DOUT,CLK,IDLE);
input RD,RSTN,CLK,IDLE;//input[7:0] DIN;
output[7:0] DOUT;
wire RSTN,CLK;
wire RD,IDLE;	//RD接SENT线，即外接按键，控制读出数据
reg[7:0] DOUT;
reg[7:0] sram[0:7];
integer i;
reg[7:0] cnt1;
reg[2:0] cnt2,contain;  	//计数变量
reg WR,cout;

//写操作初始化
always@(posedge CLK) begin
	if(RSTN&WR) begin						//按下了复位键并且已经松开复位键，准备写入初始化数据在sram中
		for(i=0;i<=7;i=i+1)
			sram[i]<=i;
	end
end

//读操作
always@(posedge CLK or negedge RSTN) begin
	if(!RSTN) begin
		cnt1<=0;
		cnt2<=0;
	end
	else 
	if((!RD)&cout) begin							//按键按下且发送线路空闲
		case(cnt1)
			8'd15:begin									//计数16个，说明是真的按下了按键而不是干扰信号
				cnt1<=0;
				contain<=cnt2;
				cnt2<=cnt2+1'b1;
			end
			default:begin								//消除按键干扰，连续计数多次按键情况后确认是按下按键将数据送出，等到释放按键后数据已经稳定送出
				cnt1<=cnt1+1'b1;
			end
		endcase
	end
end

always@(posedge CLK or negedge RSTN) begin
	if(!RSTN) begin
		DOUT<=8'hzz;
		WR<=1;										 //初始化时将写信号置1，等~RSTN时初始化写入数据
	end
	else 
		DOUT<=sram[contain];
end

always@(posedge CLK or negedge RSTN) begin
	if(~RSTN) cout<=1;
	else begin
		if(cnt1==8'd15) cout<=0;
		if(IDLE) cout<=1;
	end
end	
endmodule
	
	
		
		
			
	
	
	
	
	
	
	
	
	
	
